package com.example.demo.util;

import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;

public class IOUtils extends org.apache.tomcat.util.http.fileupload.IOUtils {

    /**
     * 尝试读取io流，一直读取到和对应字节组<code>seq</code>相符的节点，并将对应节点前的数据转成字节返回。
     * <p>
     * 若查询无数据，则返回null.
     * <p>
     * 读取完成后，流将处于读取字节组后一个位置
     * <p>
     * 因为该方法确保所有输入流的正常行为，所以无法使用支持<code>InputStream.reset()</code>实现的输入流(类似<code>BufferedInputStream</code>)
     * 因此无法确保该方法的资源消耗，谨慎使用。
     * <p>
     *
     * @param input 待处理数据流
     * @param seq   对应的字节组
     * @return
     * @throws IOException
     */
    public static final byte[] readUntil(InputStream input, byte[] seq) throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        int read = -1;
        int offset = 0;
        while ((read = input.read()) != -1) {
            bos.write(read);
            if (read == seq[offset]) {
                offset++;
                if (offset >= seq.length)
                    break;
            } else {
                offset = 0;
            }
        }
        if (offset == seq.length) {
            byte[] src = bos.toByteArray();
            byte[] result = new byte[src.length - seq.length];
            System.arraycopy(src, 0, result, 0, src.length - seq.length);
            return result;
        } else {
            return null;
        }
    }

    /**
     * 安静的关闭一个可关闭的流<p>
     *
     * @param io 待关闭的流
     * @see Closeable
     */
    public static final void closeQuietly(Closeable io) {
        if (io != null) {
            try {
                io.close();
            } catch (IOException e) {
            }
        }
    }

}
